package ipt.pru.F3;

import ipt.enumeracion.Rol;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * Clase para probar la ordenacion de los alumnos en las distintas coleccionnes. Crea fichero de log.
 * @author alumno09
 * @author alumno10
 * @author alumno11
 * @author alumno12
 *
 */



public class ProbarAlumnosF3Colecciones {

	
	//path para leer el fichero externo de alumnos
			private static final String FILE_PATH = "data";
			private static final String FILE_NAME = "/Alumnos.txt";
			private static final String LOG4J_PATH= "config/log4jF3.properties";
			private FileReader fr;
			private BufferedReader br;
			private long ini;
			private long fin;
			public static final Logger log = Logger.getLogger(ProbarAlumnosF3Colecciones.class); 
			
/**
 * Constructor vacio			
 */
	public ProbarAlumnosF3Colecciones()
	{
		super();
	}

	
	public BufferedReader prepararArchivo(){
		try {
			ini =System.currentTimeMillis();
			fr=new FileReader( FILE_PATH + FILE_NAME );				
			br=new BufferedReader(fr);
		} catch (Exception e){
			
		}
		return br;
	}
	/**
	 * Cierra el BufferedReader y el FileReader nesarios para leer el fichero.
	 */
	public void cerrarArchivo(){
		try{
			if (br!=null) br.close();
			if (fr!=null) fr.close();
		}catch(Exception e){
			
		}
	}
	
	/**
	 * Lee el fichero y devuelve un array AlumnoF3[] con los datos.
	 * @return  AlumnoF3[]
	 */
	public AlumnoF3[] mostrarArray(){
		prepararArchivo();
		String read;
		AlumnoF3 al;
		AlumnoF3[] alumnos=new AlumnoF3[10000];
		int elem;
		try {
			ini =System.currentTimeMillis();
			read="";
			elem=0;
			while(read!=null&elem<10000){
				read=br.readLine();
				StringTokenizer t=new StringTokenizer(read,",");
				al=new AlumnoF3();
				al.setNombre(t.nextToken());
				al.setApellido1(t.nextToken());
				al.setApellido2(t.nextToken());
				al.setEdad(Integer.parseInt(t.nextToken()));
				al.setE_mail(t.nextToken());
				String dni=t.nextToken();
				String rol=t.nextToken();
				al.setDni(dni);
				if (rol.equalsIgnoreCase("TRABAJADOR")){
					al.setRol(Rol.TRABAJADOR);
				} else if (rol.equalsIgnoreCase("JEFE")){
					al.setRol(Rol.JEFE);
				} else {
					al.setRol(Rol.CLIENTE);
				}
				alumnos[elem]=al;
				elem++;
			}
			long fin =System.currentTimeMillis();
			log.info(fin - ini+" ms. "+alumnos.length+" Mostrar: "+alumnos.getClass().toString());
		} catch (Exception e){
			log.error(e.getMessage(),e.getCause());
		}
		return alumnos;
	}
	
	/**
	 * Funcion que recibe un Array de AlumnosF3[] y lo ordena.
	 */
	public void ordenarArray(AlumnoF3[] alumnos){
			ini =System.currentTimeMillis();
			Arrays.sort(alumnos, new AlumnoF3.NombreComparator());
			
			fin =System.currentTimeMillis();
			log.info(fin-ini+" ms. "+alumnos.length+" Ordenar: "+alumnos.getClass().toString());
	}
	
	/**
	 * Funcion quee lee el fichero e introduce los datos en un ArrayList<AlumnoF3>
	 * @return ArrayList<AlumnoF3>
	 */
	public ArrayList<AlumnoF3> mostrarArrayList(){
		prepararArchivo();
		ArrayList<AlumnoF3> lista = new ArrayList<AlumnoF3>();
		try {
			ini=System.currentTimeMillis(); 
			String s;  
			s = br.readLine(); 
			while(s!=null) { 
				StringTokenizer st= new StringTokenizer(s,","); 
				AlumnoF3 al= new AlumnoF3(); 
				al.setNombre(st.nextToken()); 
				al.setApellido1(st.nextToken()); 
				al.setApellido2(st.nextToken()); 
				al.setEdad(Integer.parseInt(st.nextToken())); 
				al.setE_mail(st.nextToken()); 
				al.setDni(st.nextToken()); 
				String rol=st.nextToken();
				if (rol.equalsIgnoreCase("TRABAJADOR")){
					al.setRol(Rol.TRABAJADOR);
				} else if (rol.equalsIgnoreCase("JEFE")){
					al.setRol(Rol.JEFE);
				} else {
					al.setRol(Rol.CLIENTE);
				}
				lista.add(al); 
				s=br.readLine(); 
			}
			fin=System.currentTimeMillis(); 
			log.info(fin-ini+" ms. "+lista.size()+" Mostrar: "+lista.getClass().toString());
		} catch(Exception e){
			log.error(""+e.getMessage(),e.getCause());
		}
		return lista;
	}

	/**
	 * Recibe un ArrayList<AlumnoF3> y lo ordena.
	 */
	public void ordenarArrayList(ArrayList<AlumnoF3> lista){
			ini=System.currentTimeMillis(); 
			Collections.sort(lista,new AlumnoF3.NombreComparator());
			fin=System.currentTimeMillis();
			log.info(fin-ini+" ms. "+lista.size()+ " Ordenar: "+lista.getClass().toString());
			for(int i=0;i<lista.size();i++){ 
				 log.trace("Numero de alumno:" + i + " Ordenar Arraylist: "+lista.get(i).getNombre()); 
			 }
	}
	
	/**
	 * Funcion quee lee el fichero e introduce los datos en un Vector<AlumnoF3>
	 * @return Vector<AlumnoF3>
	 */
	public Vector<AlumnoF3> mostrarVector(){
		prepararArchivo();
		Vector<AlumnoF3> lista = new Vector<AlumnoF3>();
		try {
			ini=System.currentTimeMillis(); 
			String s;  
			s = br.readLine(); 
			while(s!=null) { 
				StringTokenizer st= new StringTokenizer(s,","); 
				AlumnoF3 al= new AlumnoF3(); 
				al.setNombre(st.nextToken()); 
				al.setApellido1(st.nextToken()); 
				al.setApellido2(st.nextToken()); 
				al.setEdad(Integer.parseInt(st.nextToken())); 
				al.setE_mail(st.nextToken()); 
				al.setDni(st.nextToken()); 
				String rol=st.nextToken();
				if (rol.equalsIgnoreCase("TRABAJADOR")){
					al.setRol(Rol.TRABAJADOR);
				} else if (rol.equalsIgnoreCase("JEFE")){
					al.setRol(Rol.JEFE);
				} else {
					al.setRol(Rol.CLIENTE);
				}
				lista.add(al); 
				s=br.readLine(); 
			}
			fin=System.currentTimeMillis(); 
			log.info(fin-ini+" .ms "+ lista.size()+ " Mostrar: "+lista.getClass().toString());
		} catch(Exception e){
			log.error(""+e.getMessage(),e.getCause());
		}
		return lista;
	}
	
	/**
	 * Recibe un Vector<AlumnoF3> y lo ordena
	 */
	public void ordenarVector(Vector<AlumnoF3> lista){

			ini=System.currentTimeMillis(); 
			Collections.sort(lista,new AlumnoF3.NombreComparator());
			fin=System.currentTimeMillis();
			log.info(fin-ini+" .ms "+lista.size()+ " Ordenar: "+lista.getClass().toString());
	}
	
	/**
	 * Funcion quee lee el fichero e introduce los datos en un LinkedList<AlumnoF3>
	 * @return LinkedList<AlumnoF3>
	 */
	public LinkedList<AlumnoF3> mostrarLinkedList(){
		prepararArchivo();
		LinkedList<AlumnoF3> lista = new LinkedList<AlumnoF3>(); 
		try {
			ini=System.currentTimeMillis();
			String s; 
			s = br.readLine(); 
			while(s!=null) { 
				StringTokenizer st= new StringTokenizer(s,","); 
				AlumnoF3 al= new AlumnoF3(); 
				al.setNombre(st.nextToken()); 
				al.setApellido1(st.nextToken()); 
				al.setApellido2(st.nextToken()); 
				al.setEdad(Integer.parseInt(st.nextToken())); 
				al.setE_mail(st.nextToken()); 
				al.setDni(st.nextToken()); 
				String rol=st.nextToken();
				if (rol.equalsIgnoreCase("TRABAJADOR")){
					al.setRol(Rol.TRABAJADOR);
				} else if (rol.equalsIgnoreCase("JEFE")){
					al.setRol(Rol.JEFE);
				} else {
					al.setRol(Rol.CLIENTE);
				}
				lista.add(al); 
				s=br.readLine(); 
			}
			fin=System.currentTimeMillis(); 
			log.info(fin-ini+" .ms "+lista.size()+ " Mostrar: "+lista.getClass().toString());
		} catch(Exception e){
			log.error(""+e.getMessage(),e.getCause());
		}
		return lista;
	}
	
	/**
	 * Recibe un LinkedList<AlumnoF3> y lo ordena
	 */
	public void ordenarLinkedList(LinkedList<AlumnoF3> lista){

			long ini=System.currentTimeMillis(); 
			Collections.sort(lista,new AlumnoF3.NombreComparator());
			long fin=System.currentTimeMillis();
			log.info(fin-ini+ " ms. "+ lista.size()+ " Ordenar: "+lista.getClass().toString());

	}
	
	/**
	 * Funcion quee lee el fichero e introduce los datos en un TreeMap<String,AlumnoF3>
	 * @return TreeMap<String,AlumnoF3>
	 */
	public TreeMap<String,AlumnoF3> mostrarTreeMap(){
		prepararArchivo();
		String read;
		AlumnoF3 al;
		TreeMap<String,AlumnoF3> ht = new TreeMap<String,AlumnoF3>();
		int elem;
		try {
			ini=System.currentTimeMillis();
			read="";
			elem=0;
			while(read!=null&elem<10000){
				read=br.readLine();
				StringTokenizer t=new StringTokenizer(read,",");
				al=new AlumnoF3();
				al.setNombre(t.nextToken());
				al.setApellido1(t.nextToken());
				al.setApellido2(t.nextToken());
				al.setEdad(Integer.parseInt(t.nextToken()));
				al.setE_mail(t.nextToken());
				String dni=t.nextToken();
				String rol=t.nextToken();
				if (rol.equalsIgnoreCase("TRABAJADOR")){
					al.setRol(Rol.TRABAJADOR);
				} else if (rol.equalsIgnoreCase("JEFE")){
					al.setRol(Rol.JEFE);
				} else {
					al.setRol(Rol.CLIENTE);
				}
				ht.put(dni, al);
				elem++;
			}
			fin =System.currentTimeMillis();
			log.info(fin-ini+" ms. "+ht.size()+" Mostrar: "+ht.getClass().toString());
		} catch (Exception e){
			log.error(""+e.getMessage(),e.getCause());
		}
		return ht;
	}
	
	/**
	 * Funcion que recibe un TreeMap<String,AlumnoF3> y lo ordena.
	 */
	public void ordenarTreeMap(TreeMap<String,AlumnoF3> ht){
		
			ini =System.currentTimeMillis();
			List<String> list=new ArrayList<String>(ht.keySet());
			Collections.sort(list);
			fin =System.currentTimeMillis();
			log.info(fin-ini+ " ms. "+ht.size()+" Ordenar: "+ht.getClass().toString());
	}
	
	/**
	 * Funcion quee lee el fichero e introduce los datos en un Hashtable<String,AlumnoF3>
	 * @return Hashtable<String,AlumnoF3>
	 */
	public Hashtable<String,AlumnoF3> mostrarHashtable(){
		prepararArchivo();
		String read;
		AlumnoF3 al;
		Hashtable<String,AlumnoF3> ht = new Hashtable<String,AlumnoF3>();
		int elem;
		try {
			long ini =System.currentTimeMillis();
			read="";
			elem=0;
			while(read!=null&elem<10000){
				read=br.readLine();
				StringTokenizer t=new StringTokenizer(read,",");
				al=new AlumnoF3();
				al.setNombre(t.nextToken());
				al.setApellido1(t.nextToken());
				al.setApellido2(t.nextToken());
				al.setEdad(Integer.parseInt(t.nextToken()));
				al.setE_mail(t.nextToken());
				String dni=t.nextToken();
				String rol=t.nextToken();
				if (rol.equalsIgnoreCase("TRABAJADOR")){
					al.setRol(Rol.TRABAJADOR);
				} else if (rol.equalsIgnoreCase("JEFE")){
					al.setRol(Rol.JEFE);
				} else {
					al.setRol(Rol.CLIENTE);
				}
				ht.put(dni, al);
				elem++;
			}
			long fin =System.currentTimeMillis();
			log.info(fin-ini+" ms."+ht.size()+" Mostrar: "+ht.getClass().toString());
		} catch (Exception e){
			log.error(""+e.getMessage(),e.getCause());
		}
		return ht;
	}
	
	/**
	 * Recibe un Hashtable<String,AlumnoF3> y crea una coleccion ordenada de sus claves
	 * 
	 */
	public void ordenarHashtable(Hashtable<String,AlumnoF3> ht){
		
			ini =System.currentTimeMillis();
			List<String> list=Collections.list(ht.keys());
			Collections.sort(list);
			fin =System.currentTimeMillis();
			log.info(fin-ini+" ms. "+ht.size()+" Ordenar: "+ht.getClass().toString());
	}
	
	/**
	 * Funcion quee lee el fichero e introduce los datos en un HashMap<String,AlumnoF3>
	 * @return HashMap<String,AlumnoF3>
	 */
	public HashMap<String,AlumnoF3> mostrarHashMap(){
		prepararArchivo();
		String read;
		AlumnoF3 al;
		HashMap<String,AlumnoF3> ht = new HashMap<String,AlumnoF3>();
		int elem;
		try {
			ini =System.currentTimeMillis();
			read="";
			elem=0;
			while(read!=null&elem<10000){
				read=br.readLine();
				StringTokenizer t=new StringTokenizer(read,",");
				al=new AlumnoF3();
				al.setNombre(t.nextToken());
				al.setApellido1(t.nextToken());
				al.setApellido2(t.nextToken());
				al.setEdad(Integer.parseInt(t.nextToken()));
				al.setE_mail(t.nextToken());
				String dni=t.nextToken();
				String rol=t.nextToken();
				if (rol.equalsIgnoreCase("TRABAJADOR")){
					al.setRol(Rol.TRABAJADOR);
				} else if (rol.equalsIgnoreCase("JEFE")){
					al.setRol(Rol.JEFE);
				} else {
					al.setRol(Rol.CLIENTE);
				}
				ht.put(dni, al);
				elem++;
			}
			fin =System.currentTimeMillis();
			log.info(fin-ini+" ms. "+ ht.size()+" Mostrar: "+ht.getClass().toString());
		} catch (Exception e){
			log.error(""+e.getMessage());
		}
		return ht;
	}
	
	/**
	 * Recibe un HashMap<String,AlumnoF3> y crea una lista ordenada de sus claves.
	 */
	public void ordenarHashMap(HashMap<String,AlumnoF3> ht){
		ini =System.currentTimeMillis();
			List<String> list=new ArrayList<String>(ht.keySet());
			Collections.sort(list);
			fin =System.currentTimeMillis();
			log.info(fin-ini + " ms. "+ht.size()+" Ordenar: "+ht.getClass().toString());
	}
	
	/**
	 * Funcion quee lee el fichero e introduce los datos en un Stack<AlumnoF3>
	 * @return Stack<AlumnoF3>
	 */
	public Stack<AlumnoF3> mostrarPila(){
		prepararArchivo();
		Stack<AlumnoF3> lista = new Stack<AlumnoF3>(); 
		try {
			ini=System.currentTimeMillis();
			String s; 
			s = br.readLine(); 
			while(s!=null) { 
				StringTokenizer st= new StringTokenizer(s,","); 
				AlumnoF3 al= new AlumnoF3(); 
				al.setNombre(st.nextToken()); 
				al.setApellido1(st.nextToken()); 
				al.setApellido2(st.nextToken()); 
				al.setEdad(Integer.parseInt(st.nextToken())); 
				al.setE_mail(st.nextToken()); 
				al.setDni(st.nextToken()); 
				String rol=st.nextToken();
				if (rol.equalsIgnoreCase("TRABAJADOR")){
					al.setRol(Rol.TRABAJADOR);
				} else if (rol.equalsIgnoreCase("JEFE")){
					al.setRol(Rol.JEFE);
				} else {
					al.setRol(Rol.CLIENTE);
				}
				lista.add(al); 
				s=br.readLine(); 
			}
			fin=System.currentTimeMillis(); 
			log.info(fin-ini+ " ms. "+ lista.size()+ " Mostrar: "+lista.getClass().toString());
		} catch(Exception e){
			log.error(""+e.getMessage(),e.getCause());
		}
		return lista;
	}
	
	/**
	 * Funcion que recibe Stack<AlumnoF3> y la ordena.
	 */
	public void ordenarPila(Stack<AlumnoF3> lista){
		ini=System.currentTimeMillis(); 
			Collections.sort(lista,new AlumnoF3.NombreComparator());
			fin=System.currentTimeMillis();
			log.info(fin-ini+ " ms. "+ lista.size()+ " Ordenar: "+lista.getClass().toString());
	}
	
	
	
	/**
	 * Recibe una coleccion de AlumnosF3 y la mues
	 * @param lista Un array de AlumnoF3[] para imprimir sus datos en un log
	 */
	public void pintarTrazaAlumnos(AlumnoF3[] lista)  
	{
		for(int i=0;i<lista.length;i++){ 
			 log.trace("Numero de alumno:" + i + " Ordenar Arraylist: "+lista[i].getNombre()); 
		 }
		
	}
	public void pintarTrazaAlumnos(ArrayList<AlumnoF3> lista)
	{
		for(int i=0;i<lista.size();i++){ 
			 log.trace("Numero de alumno:" + i + " Ordenar Arraylist: "+lista.get(i).getNombre()); 
		}
	}
	public void pintarTrazaAlumnos(Vector<AlumnoF3> lista)
	{
		for(int i=0;i<lista.size();i++){ 
			 log.trace("Numero de alumno:" + i + " Ordenar Arraylist: "+lista.get(i).getNombre()); 
		 }
	}
	public void pintarTrazaAlumnos(LinkedList<AlumnoF3> lista)
	{
		for(int i=0;i<lista.size();i++){ 
			 log.trace("Numero de alumno:" + i + " Ordenar Arraylist: "+lista.get(i).getNombre()); 
		 }
	}
	public void pintarTrazaAlumnos(TreeMap<String,AlumnoF3> lista)
	{
		for(int i=0;i<lista.size();i++){ 
			 log.trace("Numero de alumno:" + i + " Ordenar Arraylist: "+lista.get(i).getNombre()); 
		 }
	}
	public void pintarTrazaAlumnos(HashMap<String,AlumnoF3> lista)
	{
		for(int i=0;i<lista.size();i++){ 
			 log.trace("Numero de alumno:" + i + " Ordenar Arraylist: "+lista.get(i).getNombre()); 
		 }		
	}
	public void pintarTrazaAlumnos(Hashtable<String,AlumnoF3> lista)
	{
		for(int i=0;i<lista.size();i++){ 
			 log.trace("Numero de alumno:" + i + " Ordenar Arraylist: "+lista.get(i).getNombre()); 
		 }
	}
	
	public static void main(String[] args) {
		
		
		ProbarAlumnosF3Colecciones pac=new ProbarAlumnosF3Colecciones();
		PropertyConfigurator.configure(LOG4J_PATH);
		
		pac.ordenarArray(pac.mostrarArray());

		pac.ordenarArrayList(pac.mostrarArrayList());
		pac.pintarTrazaAlumnos(pac.mostrarArrayList());

		pac.ordenarVector(pac.mostrarVector());
		pac.pintarTrazaAlumnos(pac.mostrarVector());
		
		pac.ordenarLinkedList(pac.mostrarLinkedList());
		
		pac.ordenarTreeMap(pac.mostrarTreeMap());
		
		pac.ordenarHashtable(pac.mostrarHashtable());
		
		pac.ordenarHashMap(pac.mostrarHashMap());
		
		pac.ordenarPila(pac.mostrarPila());
		
		pac.cerrarArchivo();
	}
	

	
	
}
